home *** CD-ROM | disk | FTP | other *** search
/ Cre@te Online 2000 December / Cre@teOnline CD05.iso / MacSoft / XML Instance.sea / XML Instance / Required / ccs_util.jar / regex / RegExpNFA.class (.txt) < prev    next >
Encoding:
Java Class File  |  1999-12-09  |  2.4 KB  |  112 lines

  1. package regex;
  2.  
  3. import java.util.Hashtable;
  4.  
  5. class RegExpNFA {
  6.    private Hashtable nfa = new Hashtable();
  7.    private int nfaEntry;
  8.    private int nfaExit;
  9.    private int count = 0;
  10.    private RTree tree;
  11.    private boolean hasLHead = false;
  12.    private boolean hasLTail = false;
  13.    private static final String MSG_INVALID_OPERATION = "Invalid operation.";
  14.  
  15.    public int exit() {
  16.       return this.nfaExit;
  17.    }
  18.  
  19.    public RegExpNFA(RTree var1) throws NFABuildException {
  20.       this.tree = var1;
  21.       this.buildNfa();
  22.    }
  23.  
  24.    private int genNode() throws NFABuildException {
  25.       return this.count++;
  26.    }
  27.  
  28.    private void buildNfa() throws NFABuildException {
  29.       this.nfaEntry = this.genNode();
  30.       this.nfaExit = this.genNode();
  31.       this.genNfa(this.tree, this.nfaEntry, this.nfaExit);
  32.    }
  33.  
  34.    public int entry() {
  35.       return this.nfaEntry;
  36.    }
  37.  
  38.    private void addTransition(int var1, int var2, Chars var3) {
  39.       Integer var4 = new Integer(var1);
  40.       NList var5 = new NList(var3, var2, (NList)this.nfa.get(var4));
  41.       this.nfa.put(var4, var5);
  42.    }
  43.  
  44.    public NList getNList(int var1) {
  45.       Integer var2 = new Integer(var1);
  46.       return (NList)this.nfa.get(var2);
  47.    }
  48.  
  49.    public RTree getTree() {
  50.       return this.tree;
  51.    }
  52.  
  53.    private void genNfa(RTree var1, int var2, int var3) throws NFABuildException {
  54.       switch (var1.operation()) {
  55.          case 0:
  56.             this.addTransition(var2, var3, new Chars(0));
  57.             break;
  58.          case 1:
  59.             this.addTransition(var2, var3, var1.chars());
  60.             break;
  61.          case 2:
  62.             int var6 = this.genNode();
  63.             this.genNfa(var1.left(), var2, var6);
  64.             this.genNfa(var1.right(), var6, var3);
  65.             break;
  66.          case 3:
  67.             this.genNfa(var1.left(), var2, var3);
  68.             this.genNfa(var1.right(), var2, var3);
  69.             break;
  70.          case 4:
  71.             int var4 = this.genNode();
  72.             int var5 = this.genNode();
  73.             this.addTransition(var2, var4, new Chars(0));
  74.             this.genNfa(var1.left(), var4, var5);
  75.             this.addTransition(var5, var4, new Chars(0));
  76.             this.addTransition(var4, var3, new Chars(0));
  77.             break;
  78.          case 5:
  79.             if (var2 != this.nfaEntry) {
  80.                this.addTransition(var2, var3, var1.chars());
  81.             } else {
  82.                this.hasLHead = true;
  83.                this.addTransition(var2, var3, new Chars(2));
  84.             }
  85.             break;
  86.          case 6:
  87.             if (var3 != this.nfaExit) {
  88.                this.addTransition(var2, var3, var1.chars());
  89.             } else {
  90.                this.hasLTail = true;
  91.                this.addTransition(var2, var3, new Chars(3));
  92.             }
  93.             break;
  94.          default:
  95.             throw new NFABuildException("Invalid operation.");
  96.       }
  97.  
  98.    }
  99.  
  100.    public int count() {
  101.       return this.count;
  102.    }
  103.  
  104.    public boolean hasLHead() {
  105.       return this.hasLHead;
  106.    }
  107.  
  108.    public boolean hasLTail() {
  109.       return this.hasLTail;
  110.    }
  111. }
  112.